package com.algorithm.classics150.链表;

/**
 * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
 *
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 *
 * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * 输入：l1 = [2,4,3], l2 = [5,6,4]
 * 输出：[7,0,8]
 * 解释：342 + 465 = 807.
 * 示例 2：
 *
 * 输入：l1 = [0], l2 = [0]
 * 输出：[0]
 * 示例 3：
 *
 * 输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 * 输出：[8,9,9,9,0,0,0,1]
 */
public class 两数相加_2 {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode node = new ListNode();
        ListNode resNode = node;
        int val = 0;
        int nval;
        int i;
        //遍历l1和l2两个链表
        while (l1 != null || l2 != null){
            if (l1 == null){
                i = l2.val + val;
                l2 = l2.next;
            }else if (l2 == null){
                i = l1.val + val;
                l1 = l1.next;
            }else {
                i = l1.val + l2.val + val;
                l1 = l1.next;
                l2 = l2.next;
            }
            val = i / 10;
            nval = i % 10;
            node.next = new ListNode(nval);
            node = node.next;
        }
        //最后一个进位需要注意，如果不为零就需要加到链表里面
        if (val != 0){
            node.next = new ListNode(val);
        }
        return resNode.next;
    }

    /**
     * 时间复杂度：O(max(m,n))，其中 m 和 n 分别为两个链表的长度。我们要遍历两个链表的全部位置，而处理每个位置只需要 O(1) 的时间。
     *
     * 空间复杂度：O(1)。注意返回值不计入空间复杂度。
     */
}
